"""数据库配置"""
from sqlalchemy import create_engine
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import sessionmaker
from soulapi.core import setting

# 数据库初始化
# # Mysql配置
# MYSQL_USER = 'root'
# MYSQL_PASS = '123456'
# MYSQL_HOST = 'localhost'
# MYSQL_PORT = '3306'
# MYSQL_DB = 'heartdb'
# SQLALCHEMY_DATABASE_URL = 'mysql+pymysql://%s:%s@%s:%s/%s' % (MYSQL_USER, MYSQL_PASS, MYSQL_HOST, MYSQL_PORT, MYSQL_DB)
# # SQLALCHEMY_DATABASE_URL: str = 'mysql+pymysql://<username>:<password>@localhost:3306/<db_name>?charset=utf8'

# 生成一个SQLAlchemy引擎,对连接池和数据库方言的管理维护,初始化数据库连接，用于执行数据CRUD操作 create_engine传入两个参数，
# ① 上面创建的database url,② 是否预加载连接池,③ echod表示引擎用repr()函数就所有语句机器参数列表到日志，
engine = create_engine(setting.SQLALCHEMY_DATABASE_URL, pool_pre_ping=True, encoding='utf-8')

# 获取数据库会话maker也就是负责生成会话的，curd通过会话（session）
# ① SessionLocal指Data Session, ②autocommit是否自动提交 ③autoflush是否自动刷新并加载数据库 flush发送数据库语句到数据库，不一定写入磁盘 ，④ bind 绑定数据库引擎
SessionLocal = sessionmaker(autocommit=False, autoflush=False, bind=engine, expire_on_commit=True)

# 创建对象的基类（基本映射类），声明
# 与数据库表一致的所有models的父类，完成table与model类之间的映射
# declarative_base工厂方法构造的声明系统
Base = declarative_base(bind=engine, name='Base')


# Dependency，依赖项，也就是每次都需要，每次经过此方法就产生一个db会话
# 用于之后操作数据库
def get_db():
    try:
        db = SessionLocal()  # 本地会话
        yield db
    finally:
        db.close()
        print('数据库关闭咯')

